/**
 * @file 书签管理 IPC 处理器
 * @description 处理渲染进程与主进程之间的书签相关通信
 * 支持两表设计：文件夹层级 + 书签项
 */

import { ipcMain } from 'electron'
import { databaseManager } from '#/database'
import type {
  BookmarkFolderModel,
  QueryBookmarkFolderParams
} from '#/database/models/bookmark-folder.model'
import type {
  BookmarkItemModel,
  QueryBookmarkItemParams
} from '#/database/models/bookmark-item.model'
import { BOOKMARK_MANAGER_CHANNELS } from '~shared/ipc-topic'

/** 将文件夹模型转换为可通过 IPC 传输的纯对象 */
function folderToDTO(m: BookmarkFolderModel) {
  return {
    _id: m._id.toString(),
    id: m.id ?? undefined,
    name: m.name,
    parent_id: m.parent_id?.toString() ?? null,
    sort: m.sort ?? undefined,
    created_at: m.created_at.getTime(),
    updated_at: m.updated_at.getTime()
  }
}

/** 将书签项模型转换为可通过 IPC 传输的纯对象 */
function itemToDTO(m: BookmarkItemModel) {
  return {
    _id: m._id.toString(),
    id: m.id ?? undefined,
    link: m.link,
    title: m.title,
    folder_id: m.folder_id?.toString() ?? null,
    sort: m.sort ?? undefined,
    created_at: m.created_at.getTime(),
    updated_at: m.updated_at.getTime()
  }
}

/**
 * 注册书签管理 IPC 处理器
 */
export function registerBookmarkManagerHandlers(): void {
  const service = databaseManager.getBookmarkService()

  // ==================== 文件夹操作 ====================

  // 添加文件夹
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.ADD_FOLDER,
    async (_, input: F2.bookmark.BookmarkFolderLocal) => {
      try {
        const res = await service.addFolder(input)
        return res.success && res.data ? { success: true, data: folderToDTO(res.data) } : res
      } catch (error) {
        console.error('添加文件夹失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '添加文件夹失败' }
      }
    }
  )

  // 更新文件夹
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.UPDATE_FOLDER,
    async (_, input: F2.bookmark.BookmarkFolderLocal) => {
      try {
        const res = await service.updateFolder(input)
        return res.success && res.data ? { success: true, data: folderToDTO(res.data) } : res
      } catch (error) {
        console.error('更新文件夹失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '更新文件夹失败' }
      }
    }
  )

  // 删除文件夹
  ipcMain.handle(BOOKMARK_MANAGER_CHANNELS.DELETE_FOLDER, async (_, _id: string) => {
    try {
      return await service.deleteFolder(_id)
    } catch (error) {
      console.error('删除文件夹失败:', error)
      return { success: false, error: error instanceof Error ? error.message : '删除文件夹失败' }
    }
  })

  // 查询文件夹
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.QUERY_FOLDERS,
    async (_, params: QueryBookmarkFolderParams) => {
      try {
        const res = await service.queryFolders(params)
        if (res.success && res.data) {
          return { success: true, data: res.data.map(folderToDTO), count: res.data.length }
        }
        return res
      } catch (error) {
        console.error('查询文件夹失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '查询文件夹失败' }
      }
    }
  )

  // ==================== 书签操作 ====================

  // 添加书签
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.ADD_BOOKMARK,
    async (_, input: F2.bookmark.BookmarkLocal) => {
      try {
        const res = await service.addBookmark(input)
        return res.success && res.data ? { success: true, data: itemToDTO(res.data) } : res
      } catch (error) {
        console.error('添加书签失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '添加书签失败' }
      }
    }
  )

  // 更新书签
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.UPDATE_BOOKMARK,
    async (_, input: F2.bookmark.BookmarkLocal) => {
      try {
        const res = await service.updateBookmark(input)
        console.log('更新书签结果:', res)
        return res.success && res.data ? { success: true, data: itemToDTO(res.data) } : res
      } catch (error) {
        console.error('更新书签失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '更新书签失败' }
      }
    }
  )

  // 删除书签
  ipcMain.handle(BOOKMARK_MANAGER_CHANNELS.DELETE_BOOKMARK, async (_, _id: string) => {
    try {
      return await service.deleteBookmark(_id)
    } catch (error) {
      console.error('删除书签失败:', error)
      return { success: false, error: error instanceof Error ? error.message : '删除书签失败' }
    }
  })

  // 查询书签
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.QUERY_BOOKMARKS,
    async (_, params: QueryBookmarkItemParams) => {
      try {
        const res = await service.queryBookmarks(params)
        return res.success && res.data
          ? { success: true, data: res.data.map(itemToDTO), count: res.data.length }
          : { success: false, error: (res as any).error, data: [] }
      } catch (error) {
        console.error('查询书签失败:', error)
        return {
          success: false,
          error: error instanceof Error ? error.message : '查询书签失败',
          data: []
        }
      }
    }
  )

  // 同步到云端
  ipcMain.handle(BOOKMARK_MANAGER_CHANNELS.SYNC_TO_CLOUD, async () => {
    try {
      return await service.syncToCloud()
    } catch (error) {
      console.error('同步到云端失败:', error)
      return { success: false, error: error instanceof Error ? error.message : '同步到云端失败' }
    }
  })

  // 从云端同步
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.SYNC_FROM_CLOUD,
    async (_, cloudBookmarks: F2.bookmark.Bookmark[]) => {
      try {
        return await service.syncFromCloud(cloudBookmarks)
      } catch (error) {
        console.error('从云端同步失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '从云端同步失败' }
      }
    }
  )

  // 从 Chrome 导入（可选参数：{ filePath?: string; profile?: string }）
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.IMPORT_FROM_CHROME,
    async (_, params?: { filePath?: string; profile?: string }) => {
      console.log('导入 Chrome 书签:', params)
      try {
        const service = databaseManager.getBookmarkService()
        if (params?.filePath) {
          return await service.importFromFile(params.filePath, 'chrome')
        }
        return await service.importFromBrowser('chrome', params?.profile || 'Default')
      } catch (error) {
        console.error('导入 Chrome 书签失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '导入失败' }
      }
    }
  )

  // 从 Edge 导入（可选参数：{ filePath?: string; profile?: string }）
  ipcMain.handle(
    BOOKMARK_MANAGER_CHANNELS.IMPORT_FROM_EDGE,
    async (_, params?: { filePath?: string; profile?: string }) => {
      try {
        const service = databaseManager.getBookmarkService()
        if (params?.filePath) {
          return await service.importFromFile(params.filePath, 'edge')
        }
        return await service.importFromBrowser('edge', params?.profile || 'Default')
      } catch (error) {
        console.error('导入 Edge 书签失败:', error)
        return { success: false, error: error instanceof Error ? error.message : '导入失败' }
      }
    }
  )

  console.log('✅ 书签管理 IPC 处理器已注册')
}
